/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import static DAO.TinhDAO.PROC_INSERT;
import DTO.TinhDTO;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author HuuTri
 * Giao tiếp giữa DTO và Data
 */
public class TinhDAO {
    static String PROC_CHECK_MATINH = "spTinhCheckMaTinh";
    static String PROC_INSERT = "spTinhInsert";
    static String PROC_DELETE = "spTinhDelete";
    static String PROC_UPDATE = "spTinhUpdate";
    static String PROC_SELECT_ALL = "spTinhSelectALL";
    static String PROC_GET_NEWQUAN = "spTinhGetNewMaQuan";
    static String PROC_UPDATE_MAQUAN = "spTinhUpdateQuanOfTinh";
    static String PROC_GET_MATINH = "spTinhGetAllOfMaTinh";
    
    public static boolean checkMaTinh(TinhDTO tinh) {
        boolean res = true;
        
        try {
            DefaultTableModel tableModel =  SQLHelperDAO.execQuery(
                    PROC_CHECK_MATINH, 
                    getParamList(tinh));
            if (tableModel.getRowCount() > 0) res = false;            
        } catch (Exception ex) {
            res = false;
        }
        
        return res;
    }
    
    public static boolean insert(TinhDTO tinh) {
        boolean res = true;
        
        try {
            SQLHelperDAO.execNonQuery(PROC_INSERT, getParamList(tinh));
            MaSoDAO.updateMaSo(TinhDTO.TABLE);
        } catch (Exception ex) {
            res = false;
        } 
        
        // Trả về giá trị true nếu thực hiện thành công, false nếu thực hiện thất bại
        return res; 
    }
    
    /*Xóa thông tin của tỉnh dựa vào mã số tỉnh*/
    public static boolean delete(TinhDTO tinh) {
        boolean res = true;
        
        try {
            SQLHelperDAO.execNonQuery(PROC_DELETE, getParamList(tinh));
        } catch (Exception ex) {
            res = false;
        }
        
        return res;
    }
    
    /*Cập nhật thông tin dựa vào mã tỉnh*/
    public static boolean update(TinhDTO tinh){
        boolean res = true;
        
        try {
            SQLHelperDAO.execNonQuery(PROC_UPDATE, getParamList(tinh));
        } catch(Exception ex) {
            res = false;
        }
        
        return res;
    }
    
    /*Lấy toàn bộ thông tin tỉnh*/
    public static DefaultTableModel getTableModel() {
        return SQLHelperDAO.execQuery(PROC_SELECT_ALL, null);
    }
    
    /*Lấy thông tin mã quận mới từ của một tỉnh từ mã tỉnh*/
    public static int getNewMaQuanOfTinh(TinhDTO tinh) {
        int res = 0; // kết quả trả về
        try {
            DefaultTableModel tableModel = SQLHelperDAO.execQuery(PROC_GET_NEWQUAN, getParamList(tinh));
            res = (int) tableModel.getValueAt(0,0);
        } catch (Exception ex) {
            int stop = 0;
        }
        return res; // Trả về kết quả
    }
    
    /*Update số lượng quận hiện tại*/
    public static void updateMaQuanHienTai(TinhDTO tinh) {
        SQLHelperDAO.execNonQuery(PROC_UPDATE_MAQUAN, getParamList(tinh));
    }
    
    /*Lấy danh sách mã tỉnh*/
    public static List<String> getMaTinhList() {
        List<String> res = new ArrayList<>();
        DefaultTableModel tableModel = SQLHelperDAO.execQuery(PROC_GET_MATINH, null);
        
        int rows = tableModel.getRowCount();
        for(int i = 0; i < rows; i++) {
            res.add(tableModel.getValueAt(i, 0).toString());
        }
        
        return res;
    }
    
    /*Tạo danh sách tham số từ đối tượng TinhDTO*/
    private static  List<Parameter> getParamList(TinhDTO tinh) {
        List<Parameter> listParams = new ArrayList<>();
        
        // Chèn các phần tử vào danh sách Parameters
        listParams.add(new Parameter(TinhDTO.ID, tinh.getId()));
        listParams.add(new Parameter(TinhDTO.MA_TINH, tinh.getMaTinh()));
        listParams.add(new Parameter(TinhDTO.TEN_TINH, tinh.getTenTinh()));
        listParams.add(new Parameter(TinhDTO.MO_TA, tinh.getMoTa()));
        
        return listParams;
    }
    
    public static int getNewId() {
        return MaSoDAO.getMaSo(TinhDTO.TABLE);
    }
}
